/*
 * @Description: 金钱转换
 * @Author: Kerwin
 * @Date: 2025-05-17 11:06:19
 * @LastEditTime: 2025-11-17 16:51:21
 * @LastEditors:  Please set LastEditors
 */
/**
 * 金额处理工具类
 */
export const moneyUtils = {
  /**
   * 转换为分（去掉小数部分多余精度）
   * @param money 金额（元）
   */
  toCents(money: number): number {
    return Math.round(parseFloat((money * 100).toFixed(2)))
  },

  /**
   * 转换回元
   * @param cents 分
   */
  toYuan(cents: number): number {
    return parseFloat((cents / 100).toFixed(2))
  },

  /**
   * 保留一位小数，并转换为分（用于抵扣券）
   * @param money 原始金额（元）
   */
  toFixed1AndToCents(money: number): number {
    const fixedValue = parseFloat(money.toFixed(1)) // 保留一位小数
    return this.toCents(fixedValue) // 再转成"分"
  },

  /**
   * 安全地做减法：支持元或分的计算
   * @param moneyA 第一个金额（元）
   * @param moneyB 第二个金额（元）
   */
  subtract(moneyA: number, moneyB: number): number {
    const aCents = this.toCents(moneyA)
    const bCents = this.toCents(moneyB)

    const resultCents = aCents - bCents

    return this.toYuan(resultCents)
  },
  /**
   * 安全地做多数减法：支持元或分的计算
   * @param initialValue 初始值（元）
   * @param values 要减去的值数组（元）
   */
  subtractMultiple(initialValue: number, values: number[]): number {
    let initialCents = this.toCents(initialValue)

    for (const value of values) {
      initialCents -= this.toCents(value)
    }

    return this.toYuan(initialCents)
  },
  /**
   * 用抵扣券做减法（抵扣券只保留一位小数）
   * @param totalMoney 总金额（元）
   * @param scoreMoney 抵扣券（元，最多保留一位小数）
   */
  deductWithScore(totalMoney: number, scoreMoney: number): number {
    const moneyCents = this.toCents(totalMoney)
    const scoreCents = this.toFixed1AndToCents(scoreMoney)

    const resultCents = moneyCents - scoreCents

    return this.toYuan(resultCents)
  },

  // 金额处理工具函数
  formatPrice(price: number): number {
    if (isNaN(price) || price < 0) return 0
    return Math.round(price * 100) / 100 // 保留两位小数
  },

  safeSubtract(minuend: number, subtrahend: number): number {
    const result = minuend - subtrahend
    return Math.max(0, result) // 确保不为负数
  },
  // 鑫复来服务费
  xinfuService(price: number): number {
    if (isNaN(price) || price < 0) return 0
    return Math.ceil(price * 0.0625 * 100) / 100
  },
  /**
   * 安全地做加法：支持元或分的计算
   * @param moneyA 第一个金额（元）
   * @param moneyB 第二个金额（元）
   */
  addPrice(moneyA: number, moneyB: number): number {
    const aCents = this.toCents(moneyA)
    const bCents = this.toCents(moneyB)

    const resultCents = aCents + bCents

    return this.toYuan(resultCents)
  }
}
